package com.neusoft.controller;

import com.neusoft.common.Result;
import com.neusoft.pojo.Menu;
import com.neusoft.service.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author Miracle WYC
 * @Date 2022/4/27 10:47
 * @Version 1.0
 */
@RestController
@RequestMapping("/menu")
public class MenuController {

    @Autowired
    MenuService menuService;

    @GetMapping
    public Result<?> menuAll(@RequestBody Menu menu){
        List<Menu> menuList = menuService.selectMenuList(menu);
        // 通过传入根节点的ID 来得到根节点以下所有的菜单
        List<Menu> treeMenuList = getMenuChild("0",menuList);
        Result result = new Result(treeMenuList);
        return result;
    }

    @GetMapping("/{id}")
    public Result<?> menuById(@PathVariable String id){
        List<Menu> menuList = menuService.selectMenuById(id);
        Result result = new Result(menuList);
        return result;
    }

    @PostMapping
    public Result<?> menuAdd(@RequestBody Menu menu){
        int s = menuService.insertMenu(menu);
        if (1 == s) {
            return Result.success();
        } else {
            return Result.error("500","新增角色失败");
        }
    }

    @PutMapping
    public Result<?> menuUpdate(@RequestBody Menu menu){
        int i = menuService.updateMenu(menu);
        if (1==i){
            return Result.success();
        }
        return Result.error("400","更新失败");
    }

    @DeleteMapping("/{id}")
    public Result<?> menuDelete(@PathVariable String id){
        int s = menuService.deleteMenuById(id);
        if (1 == s) {
            return Result.success();
        } else {
            return Result.error("500","新增角色失败");
        }
    }

    /**
     * 查询菜单树结构
     * @param parentId 父类ID
     * @param menus 所有的菜单集合
     * @return 树形菜单集合
     * 简介：
     * 传入最上层的菜单ID ，和所有菜单的集合  得到子菜单。
     * 通过子菜单重复（递归） 再去调用 判断有没有子菜单 ，
     * 直到最后没有子菜单结束
     */
    public List<Menu> getMenuChild(String parentId, List<Menu> menus){

        /*定义暂存的子集合*/
        List<Menu> childMenuList = new ArrayList<>();
        /*遍历获取是跟节点的下层菜单*/
        for (Menu menu: menus){
            /*判断是不是属于根节点的菜单 ，如果属于则添加到子菜单集合*/
            if (parentId.equals(menu.getMenuParent())){
                childMenuList.add(menu);
            }
        }
        // 获取子菜单的子菜单
        for (Menu menu: childMenuList){
            List<Menu> child = getMenuChild(menu.getId(),menus);
            menu.setChildMenuList(child);
        }
        // 递归结束
        if (childMenuList.size() == 0) {
            return new ArrayList<>();
        }
        /*返回根目录下所有的集合*/
        return childMenuList;
    }

    /**
     * 根据用户ID查询该用户的所有菜单
     *
     */

    @GetMapping("/getMenu/{userId}")
    public Result<?> getMenuByUserId(@PathVariable("userId") String UserId) {
        /*获取该用户对应角色的所有菜单*/
        List<Menu> menuByUserIdList = menuService.getMenuByUserId(UserId);
        /*准备个新的菜单集合*/
        List<Menu> newMenuListByUserId = new ArrayList<>();
        /*遍历*/
        for (Menu menu : menuByUserIdList) {
            List<Menu> list = getMenuChild(menu.getMenuParent(),menuByUserIdList);
            newMenuListByUserId.add(list.get(0));
        }
        return Result.success(newMenuListByUserId);
    }




}
